/*
  军团战：论功行赏
  题目描述
    安东诺夫的公会在这次军团战中脱颖而出，成功爬到了最高的紫金段，并且经过奋战成为了独联体服务器的冠军！
    公会获得了巨量钢铁作为奖励，安东诺夫要分给参与过至少一场军团战的所有选手。

    总共有 n 名选手参加过至少一场军团战。对于每名选手，安东诺夫都记录了他们参加的场次和胜利次数。
    安东诺夫需要确定所有选手领取钢铁的顺序。他会：
      1). 先让参加场数多的领。
      2). 如果有场数相等的，再看胜利的次数，让胜利次数多的先领。
    保证不存在参加场数和胜利场数都一样的两个选手。
  输入
    第一行一个数字 n，表示有 n 名选手参加过军团战。
    接下来 n 行，每一行首先是一个长度不超过 20 且全为小写字母的字符串表示选手的用户名，
      然后是一个数表示参加过的场数，最后是一个整数表示胜利的场数。
  输出
    n 行，其中第 i 行表示第 i 个拿奖励的选手的用户名。
  样例输入
    5
    jpfdmsrvvvz 2116 11599
    cqcoaxyuofpp 49907 30641
    ycrhxglrghsffiexns 22998 16702
    gisfyfrquhijwumcc 1205 35328
    hpheezizuafsxtxqq 46117 34712
  样例输出
    cqcoaxyuofpp
    hpheezizuafsxtxqq
    ycrhxglrghsffiexns
    jpfdmsrvvvz
    gisfyfrquhijwumcc
  提示
    n ≤ 50000
    场次数量 ≤ 50000
*/

#include <bits/stdc++.h>

using namespace std;

struct str {
    string name;
    int cs;    /* 参加军团战的场数 */
    int sl;    /* 参加军团战赢得胜利的场数 */
};

/*
  自定义比较函数
  规则:
    1). 优先按照场数 (.cs) 从小到大进行排序
    2). 如果场数相同, 则按照胜利场数 (.sl) 从小到大进行排序
*/
bool cmp(str a, str b) {
    if (a.cs != b.cs) {
        return a.cs < b.cs;
    } else {
        return a.sl < b.sl;
    }
}
int main(){
    str a[50001] = {};
    int n;

    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i].name >> a[i].cs >> a[i].sl;
    }

    /* 对 a[1] ~ a[n], 按自定义比较函数 cmp() 中的规则进行排序 */
    sort(a + 1, a + n + 1, cmp);
    for (int i = n; i >= 1; i--) {
        cout << a[i].name << endl;
    }

    return 0;
}